package aceim.protocol.snuk182.vkontakte;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import aceim.api.dataentity.Buddy;
import aceim.api.dataentity.BuddyGroup;
import aceim.api.dataentity.Message;
import aceim.api.dataentity.MultiChatRoom;
import aceim.api.dataentity.OnlineInfo;
import aceim.api.dataentity.PersonalInfo;
import aceim.api.dataentity.TextMessage;
import aceim.api.service.ApiConstants;
import aceim.protocol.snuk182.vkontakte.model.VkBuddy;
import aceim.protocol.snuk182.vkontakte.model.VkBuddyGroup;
import aceim.protocol.snuk182.vkontakte.model.VkChat;
import aceim.protocol.snuk182.vkontakte.model.VkMessage;
import aceim.protocol.snuk182.vkontakte.model.VkMessageAttachment;
import aceim.protocol.snuk182.vkontakte.model.VkOnlineInfo;
import android.os.Bundle;
import android.text.TextUtils;
public final class VkEntityAdapter {
private VkEntityAdapter(){}
public static List<NameValuePair> map2NameValuePairs(Map<String, String> params) {
if (params == null) return null;
List<NameValuePair> pairs = new ArrayList<NameValuePair>(params.size());
for (String key : params.keySet()) {
pairs.add(new BasicNameValuePair(key, params.get(key)));
}
return pairs;
}
public static List<BuddyGroup> vkBuddiesAndGroups2BuddyList(List<VkBuddy> buddies, List<VkBuddyGroup> groups, List<VkOnlineInfo> onlineInfos, long myId, String ownerUid, Byte serviceId) {
if (buddies == null) {
return null;
}
Map<String, BuddyGroup> result = new HashMap<String,BuddyGroup>(groups.size() + 1);
BuddyGroup noGroup = new BuddyGroup(ApiConstants.NO_GROUP_ID, ownerUid, serviceId);
for (VkBuddyGroup vkb : groups) {
BuddyGroup bg = vkBuddyGroup2BuddyGroup(vkb, ownerUid, serviceId);
result.put(bg.getId(), bg);
}
for (VkBuddy vkb : buddies) {
Buddy b = vkBuddy2Buddy(vkb, myId, ownerUid, serviceId);
for (VkOnlineInfo vki : onlineInfos) {
if (vki.getUid() == vkb.getUid()) {
b.getOnlineInfo().getFeatures().putByte(ApiConstants.FEATURE_STATUS, vki.getStatus());
break;
}
}
if (b.getGroupId().equals(ApiConstants.NO_GROUP_ID)) {
noGroup.getBuddyList().add(b);
} else {
result.get(b.getGroupId()).getBuddyList().add(b);
}
}
if (noGroup.getBuddyList().size() > 0) {
result.put(ApiConstants.NO_GROUP_ID, noGroup);
}
return Collections.unmodifiableList(new ArrayList<BuddyGroup>(result.values()));
}
public static List<OnlineInfo> vkOnlineInfos2OnlineInfos(List<VkOnlineInfo> vkOnlineInfos, long myId, String ownerUid, Byte serviceId) {
if (vkOnlineInfos == null) return null;
List<OnlineInfo> infos = new ArrayList<OnlineInfo>(vkOnlineInfos.size());
for (VkOnlineInfo vko : vkOnlineInfos) {
OnlineInfo info = new OnlineInfo(serviceId, vkUid2ProtocolUid(vko.getUid(), myId, ownerUid));
info.getFeatures().putByte(ApiConstants.FEATURE_STATUS, (byte) 0);
infos.add(info);
}
return infos;
}
public static Buddy vkBuddy2Buddy(VkBuddy vkb, long myId, String ownerUid, Byte serviceId) {
if (vkb == null) {
return null;
}
Buddy b = new Buddy(vkUid2ProtocolUid(vkb.getUid(), myId, ownerUid), ownerUid, VkConstants.PROTOCOL_NAME, serviceId);
long groupId = vkb.getGroupId();
b.setGroupId(groupId != 0 ? Long.toString(groupId) : ApiConstants.NO_GROUP_ID);
b.setName(getNickOfVkBuddy(vkb));
return b;
}
private static String getNickOfVkBuddy(VkBuddy vkb) {
String nick = vkb.getNickName();
if (TextUtils.isEmpty(nick)) {
String fn = vkb.getFirstName();
String ln = vkb.getLastName();
return (TextUtils.isEmpty(fn) ? "" : fn) + " " + (TextUtils.isEmpty(ln) ? "" : ln);
} else {
return nick;
}
}
public static BuddyGroup vkBuddyGroup2BuddyGroup(VkBuddyGroup vkb, String ownerUid, Byte serviceId) {
if (vkb == null) {
return null;
}
BuddyGroup bg = new BuddyGroup(Long.toString(vkb.getId()), ownerUid, serviceId);
bg.setName(vkb.getName());
return bg;
}
public static OnlineInfo vkOnlineInfo2OnlineInfo(VkOnlineInfo vi, long myId, String ownerUid, byte serviceId) {
if (vi == null) return null;
OnlineInfo info = new OnlineInfo(serviceId, vkUid2ProtocolUid(vi.getUid(), myId, ownerUid));
//Does not work either
//info.getFeatures().putByte(ApiConstants.FEATURE_STATUS, vi.getStatus());
info.getFeatures().putByte(ApiConstants.FEATURE_STATUS, (byte) (vi.getStatus() == 0 ? 0 : -1));
return info;
}
public static Message vkMessage2Message(VkMessage vkm, byte serviceId, String protocolUid, long vkUid) {
if (vkm == null) return null;
//TODO support for other message types
TextMessage tm = new TextMessage(serviceId, vkUid2ProtocolUid(vkm.getPartnerId(), vkUid, protocolUid));
tm.setTime(vkm.getTimestamp());
tm.setIncoming(!vkm.isOutgoing());
tm.setMessageId(vkm.getMessageId());
tm.setText(vkm.getText());
for (VkMessageAttachment attachment : vkm.getAttachments()) {
if (attachment.getAuthorId() != 0) {
tm.setContactDetail(vkUid2ProtocolUid(attachment.getAuthorId(), vkUid, protocolUid));
}
/*if (!TextUtils.isEmpty(attachment.getId())) {
tm.setText(vkm.getText() + "\n" + attachment.getId());
}*/
}
return tm;
}
private static final String vkUid2ProtocolUid(long vkUid, long myVkUid, String protocolUid) {
return vkUid == myVkUid ? protocolUid : Long.toString(vkUid);
}
public static VkMessage textMessage2VkMessage(TextMessage message, boolean isChat) {
VkMessage vkm = new VkMessage(0, Long.parseLong(message.getContactUid()), isChat ? 16 : 0, System.currentTimeMillis(), null, message.getText(), null);
return vkm;
}
public static PersonalInfo vkBuddy2PersonalInfo(VkBuddy vkb, byte serviceId, long myVkUid, String ownerUid) {
if (vkb == null) return null;
PersonalInfo info = new PersonalInfo(serviceId);
info.setProtocolUid(vkUid2ProtocolUid(vkb.getUid(), myVkUid, ownerUid));
Bundle bundle = new Bundle();
bundle.putString(PersonalInfo.INFO_NICK, getNickOfVkBuddy(vkb));
bundle.putString(PersonalInfo.INFO_FIRST_NAME, vkb.getFirstName());
bundle.putString(PersonalInfo.INFO_LAST_NAME, vkb.getLastName());
info.setProperties(bundle);
return info;
}
public static List<PersonalInfo> vkChats2PersonalInfoList(List<VkChat> chats, byte serviceId) {
if (chats == null) return null;
List<PersonalInfo> pinfoList = new ArrayList<PersonalInfo>(chats.size());
for (VkChat vkChat : chats) {
PersonalInfo pinfo = vkChat2PersonalInfo(vkChat, serviceId);
if (pinfo != null) {
pinfoList.add(pinfo);
}
}
return pinfoList;
}
private static PersonalInfo vkChat2PersonalInfo(VkChat vkChat, byte serviceId) {
if (vkChat == null) return null;
PersonalInfo pinfo = new PersonalInfo(serviceId);
pinfo.setProtocolUid(Long.toString(vkChat.getId()));
pinfo.setMultichat(true);
pinfo.getProperties().putString(PersonalInfo.INFO_NICK, vkChat.getTitle());
return pinfo;
}
public static MultiChatRoom vkChat2MultiChatRoom(VkChat vkChat, String ownerUid, byte serviceId) {
if (vkChat == null) return null;
MultiChatRoom chat = new MultiChatRoom(Long.toString(vkChat.getId()), ownerUid, VkConstants.PROTOCOL_NAME, serviceId);
chat.setName(vkChat.getTitle());
return chat;
}
public static List<BuddyGroup> vkChatOccupants2ChatOccupants(VkChat vkChat, List<VkBuddy> occupants, long myId, String ownerUid, Byte serviceId) {
if (occupants == null) return null;
BuddyGroup moderators = new BuddyGroup(Integer.toString(1), ownerUid, serviceId);
BuddyGroup all = new BuddyGroup(Integer.toString(0), ownerUid, serviceId);
moderators.setName("Moderators");
all.setName("All");
for (VkBuddy vkBuddy : occupants) {
Buddy buddy = vkBuddy2Buddy(vkBuddy, myId, ownerUid, serviceId);
if (vkBuddy.getUid() == vkChat.getAdminId()) {
moderators.getBuddyList().add(buddy);
} else {
all.getBuddyList().add(buddy);
}
}
return Arrays.asList(moderators, all);
}
public static Message vkChatMessage2Message(long chatId, VkMessage vkm, long myUid, String ownerUid, byte serviceId) {
if (vkm == null) return null;
//TODO support for other message types
TextMessage tm = new TextMessage(serviceId, Long.toString(chatId));
tm.setContactDetail(Long.toString(vkm.getPartnerId()));
tm.setTime(vkm.getTimestamp());
tm.setIncoming(true);
tm.setMessageId(vkm.getMessageId());
tm.setText(vkm.getText());
for (VkMessageAttachment attachment : vkm.getAttachments()) {
if (attachment.getAuthorId() != 0) {
tm.setContactDetail(vkUid2ProtocolUid(attachment.getAuthorId(), myUid, ownerUid));
}
}
return tm;
}
public static List<OnlineInfo> vkChats2OnlineInfoList(Set<VkChat> chats, Set<Long> connectedChats, String protocolUid, byte serviceId) {
if (chats == null) return null;
List<OnlineInfo> infos = new ArrayList<OnlineInfo>(chats.size());
for (VkChat chat : chats) {
OnlineInfo info = new OnlineInfo(serviceId, Long.toString(chat.getId()));
if (connectedChats != null && connectedChats.contains(chat.getId())) {
info.getFeatures().putByte(ApiConstants.FEATURE_STATUS, (byte) 0);
}
infos.add(info);
}
return infos;
}
}